#target "indesign"
(function () {
    if (app.documents.length === 0) { alert("请先打开一个文档。"); return; }
    if (app.selection.length === 0) { alert("请先选中一个已置入的图片或其图片框。"); return; }

    var doc  = app.activeDocument;
    var link = getLinkFromSelection(app.selection[0]);
    if (!link || !link.isValid) { alert("未能从所选对象取得链接。"); return; }

    // —— 关键修复：在删除前就把信息缓存为字符串 —— //
    var cachedName = String(link.name || "");
    var cachedPath = String(link.filePath || (link.linkResource && link.linkResource.filePath) || "");

    // 规范化目标路径用于匹配
    var targetPath = normPath(cachedPath);
    if (!targetPath) { alert("选中的对象没有有效的外部链接（可能是嵌入）。"); return; }

    var stats = { totalLinks: 0, framesQueued: 0, deleted: 0, skipped: 0, errors: 0 };

    app.doScript(function(){
        var frames = [], seen = {};
        // 先收集所有目标链接对应的矩形框
        for (var i = 0; i < doc.links.length; i++) {
            var lk = doc.links[i];
            if (!lk.isValid) continue;
            var pth = normPath(String(lk.filePath || (lk.linkResource && lk.linkResource.filePath) || ""));
            if (!pth || pth !== targetPath) continue;

            stats.totalLinks++;

            var frame = findOwningFrame(lk);
            if (frame && frame.isValid && frame.constructor && frame.constructor.name === "Rectangle") {
                if (!seen[frame.id]) { seen[frame.id] = true; frames.push(frame); }
            }
        }

        stats.framesQueued = frames.length;

        // 删除阶段：逐个删除，容错处理
        for (var j = 0; j < frames.length; j++) {
            var fr = frames[j];
            try {
                if (!fr.isValid) continue;
                if (fr.locked || (fr.itemLayer && fr.itemLayer.locked)) { stats.skipped++; continue; }
                fr.remove();
                stats.deleted++;
            } catch (ex) {
                // 某些框因前一个删除导致父级整体被删，会出现“对象不再存在”
                stats.errors++;
            }
        }
    }, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "删除指定链接的所有图片框");

    // —— 使用缓存的字符串来展示结果（不再访问已失效的 link 对象）—— //
    alert(
        "目标文件：" + cachedName +
        "\n完整路径：" + cachedPath +
        "\n\n匹配到的链接实例：" + stats.totalLinks +
        "\n去重后框架数：" + stats.framesQueued +
        "\n已删除：" + stats.deleted +
        "\n跳过（锁定/锁层）：" + stats.skipped +
        "\n出错：" + stats.errors
    );

    /* ========= 工具函数 ========= */
    function getLinkFromSelection(obj) {
        if (!obj || !obj.isValid) return null;
        try { if (obj.itemLink && obj.itemLink.isValid) return obj.itemLink; } catch(_){}
        try {
            if (obj.graphics && obj.graphics.length > 0) {
                for (var i=0;i<obj.graphics.length;i++){
                    var g=obj.graphics[i];
                    if (g && g.isValid && g.itemLink && g.itemLink.isValid) return g.itemLink;
                }
            }
        } catch(_){}
        try {
            if (obj.allGraphics && obj.allGraphics.length > 0) {
                for (var j=0;j<obj.allGraphics.length;j++){
                    var gg=obj.allGraphics[j];
                    if (gg && gg.isValid && gg.itemLink && gg.itemLink.isValid) return gg.itemLink;
                }
            }
        } catch(_){}
        try {
            var p = obj.parent, guard=0;
            while (p && guard++ < 10) {
                if (p.itemLink && p.itemLink.isValid) return p.itemLink;
                p = p.parent;
            }
        } catch(_){}
        return null;
    }

    function normPath(p){
        p = (p===undefined||p===null) ? "" : String(p);
        p = p.replace(/^file:\/+/i, ""); // 去掉 file:/// 前缀
        p = p.replace(/\\/g, "/");
        return p.toLowerCase();
    }

    function findOwningFrame(lk){
        try {
            var gfx = lk.parent; 
            if (!gfx || !gfx.isValid) return null;
            var cand = gfx.parent;
            if (cand && cand.isValid && cand.hasOwnProperty("geometricBounds")) return cand;
            var p = gfx.parent, guard=0;
            while (p && guard++ < 10) {
                if (p.hasOwnProperty("geometricBounds")) return p;
                p = p.parent;
            }
        } catch(_){}
        return null;
    }
})();
